package com.flying.io;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @ClassName DemoIO
 * @Author flying
 * @Date 2025/2/5 17:29
 * @Description 我们读取的文件内容是已知的，因此可以使用固定次数的“int s= fis.read();”语句读取内容，但是在实际开发中通常我们根本不知道文件的内容，因此我们在读取的时候需要配合while循环使用。
 * 为了保证出现异常后流的正常关闭，通常要将流的关闭语句要放到finally语句块中，并且要判断流是不是null。
 */
public class DemoIO {

    @Test
    void test1() {


        try {
            // 创建输入流
            FileInputStream fis = new FileInputStream("a.txt");
            // 文件内容abc
            // 一个字节一个字节的读取数据
            int s1 = fis.read();     // 直接打印  十进制的 ASCII码   a
            int s2 = fis.read();     // 直接打印  十进制的 ASCII码   b
            int s3 = fis.read();     // 直接打印  十进制的 ASCII码   c
            int s4 = fis.read();     //  文件读取完毕返回    -1
            System.out.println(s1);
            System.out.println(s2);
            System.out.println(s3);
            System.out.println(s4);


            // 流对象使用完，必须关闭！不然，总占用系统资源，最终会造成系统崩溃
            fis.close();


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    // 经典写法  try-catch-finally  ※
    @Test
    void test2() {

        FileInputStream fis = null;
        try {
            fis = new FileInputStream("a.txt");
            StringBuilder sb = new StringBuilder();
            int temp = 0;

            // 1： 将temp赋值为 每一次读取到的内容
            // 2. 并判断是否无内容可读
            while ((temp = fis.read()) != -1) {
                sb.append((char) temp);
            }

            System.out.println("sb = " + sb);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 此种写法当try块出现异常时也会执行对流的关闭操作
            // 流的操作遵循 后开先关 原则

            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * IO流经典写法2： try...with...resource
     */

    @Test
    void test3(){
        /**
         * 在JDK7以及以后的版本中可以使用try-with-resource语法更优雅的关闭资源。
         * java.lang.AutoCloseable接口：
         * 在java.lang.AutoCloseable接口中包含了一个close方法，该方法用于关闭资源。
         * 只要是实现了java.lang.AutoCloseable接口的对象，都可以使用try-with-resource关闭资源。
         */

        try(FileInputStream fis = new FileInputStream("a.txt");) {
            StringBuilder sb = new StringBuilder();
            int temp = 0;
            // 1： 将temp赋值为 每一次读取到的内容
            // 2. 并判断是否无内容可读
            while ((temp = fis.read()) != -1) {
                sb.append((char) temp);
            }
            System.out.println("sb = " + sb);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }




}
